Changes from CA-Clipper 5.01 to CA-Clipper 5.2 This document contains a summary of changes made to CA-Clipper 5.2. A more detailed description of all items will be available in the Norton Guide file that comes with your CA-Clipper 5.2. If you have further questions please post a message on the Clipper forum on CompuServe -- we'll be happy to answer your questions. By Luiz Quintela Product Manager CA-Clipper, CA-Visual Objects for Clipper, CA-C++, CA-CommonView NEW: Memory Management CA-Clipper 5.2 improves the handling of expanded memory. Version 5.01 applications would hang in certain circumstances on a machine using a LIM 4.0 compatible EMS driver with the page frame disabled. CA-Clipper 5.2 requires that you enable the EMS page frame. If the EMS page frame is not detected, EMS will not be used. NEW: LIM 4.0 support Support for LIM 4.0 has been added. If CA-Clipper detects a LIM 4.0 compatible driver, up to 32MB of EMS will be used. NEW: RSIS support CA-Clipper is now RSIS (Relocatable Screen Interface Specification) compliant. This produces faster screen updates when a RSIS compliant driver is loaded. CHANGED: Database error handling In CA-Clipper 5.01, using database commands without an open work area would not cause an error. With the following exceptions, CA-Clipper 5.2 now produces a "Work area not in use" error. EIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII" o Function Return value o CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP o o o EOF() --> .T. o o BOF() --> .T. o o FOUND() --> .F. o o DELETED() --> .F. o o RECNO() --> 0 (zero) o o LASTREC() --> 0 (zero) o o FIELDNAME(1) --> "" o o FCOUNT() --> 0 (zero) o o INDEXORD() --> 0 (zero) o o INDEXKEY() --> "" o o DBSTRUCT() --> {} (empty array) o o HEADER() --> 0 (zero) o o RECSIZE() --> 0 (zero) o o LUPDATE() --> / / (empty date) o o o EIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII CHANGED: Miscellaneous error handling Improved error handling in many CA-Clipper commands and functions traps and reports missing arguments or invalid arguments passed to them. CHANGED: Aliases CA-Clipper now detects illegal characters in the alias and produces an EG_BADALIAS error. CA-Clipper now generates an EG_DUPALIAS error if you attempt to create an alias identifier that is already in use. CHANGED: Reserved Word AADD has been added to the Reserved Word list. NEW: Unrecoverable error messages Unrecoverable errors are runtime errors that for some reason cannot make use of the error system. The following runtime unrecoverable error messages are now documented: 24 Write error 331 String/array memory overflow 332 String/array memory overflow 415 Cannot open overlay file 5302 Conventional memory exhausted 5304 Conventional memory exhausted 5306 Conventional memory exhausted 5312 VM swap file overallocated CHANGED: Miscellaneous Fixes LABEL FORM now uses the SET DEFAULT setting to locate files when the .LBL file is not in the default directory and an absolute path name is not specified. DBEDIT() now accepts memory variables and expressions as arguments in the array. When specified, DBEDIT() now properly displays field aliases in column headings. This is consistent with the Summer '87 version of CA-Clipper. WAIT now accepts characters in the range 32 through 255 (ASCII). MENU TO no longer repaints the screen with the last prompt when you press to exit the menu. CHANGED: COPY FILE The COPY FILE command now allows control characters to be copied to a device (printer, serial port, etc.). CHANGED: CREATE FROM The following clauses have been added. NEW is an optional clause that designates that the newly created database should be opened in a new workarea. ALIAS is the alias name to use when opening the database in a new work area. VIA is the name of the database driver to use to create the database. CHANGED: INDEX ON FOR specifies the conditional set of records on which to index. WHILE specifies another condition that each record processed must meet EVAL specifies a condition that is evaluated either for each record processed or at the interval specified by the EVERY clause EVERY specifies a numeric expression that modifies how often EVAL is evaluated. ASCENDING specifies that the index keys be sorted in increasing order of value. DESCENDING specifies that the index keys be sorted in decreasing order of value. CHANGED: REINDEX EVAL specifies a condition that is evaluated either for each record processed or at the interval specified by the EVERY clause. CHANGED: RESTORE FROM Various bugs have been fixed. CHANGED: SET ORDER* SET ORDER* is now classified as a compatibility command. It is recommended that you use the new SET TAG command instead. CHANGED: BROWSE()* BROWSE()* is now classified as a compatibility function. It is recommended that you use the TBROWSE class instead. NEW: COLORSELECT() COLORSELECT() activates the specified color pair, it does not alter the current SET COLOR setting. CHANGED: DBCREATE() DBCREATE() now accepts an optional additional parameter . is the name of the database driver to use to create the database. CHANGED: DISPCOUNT() DISPCOUNT() determines the current display context. CHANGED: DISPBEGIN()/DISPEND() Each call to DISPBEGIN() defines a new display context. Output to the display context is suppressed until a matching DISPEND() statement is executed. CHANGED: MEMOEDIT() In the previous release of CA-Clipper MEMOEDIT() failed to append a NULL character to the end of its return string. CHANGED: SCROLL() You can now scroll columns horizontally. NEW: #STDOUT The new directive #STDOUT causes the compiler to output a literal text to the standard output device (stdout) during compilation. NEW: ANNOUNCE ANNOUNCE is a declaration statement that defines a module identifier. NEW: EXIT PROCEDURE The EXIT PROCEDURE statement declares a procedure that will be executed on program termination. CHANGED: EXTERNAL* EXTERNAL* is now classified as a compatibility statement. It is recommended that you use the new REQUEST statement instead. NEW: INIT PROCEDURE The INIT PROCEDURE statement declares a procedure that will be executed at program startup. NEW: REQUEST REQUEST is a declaration statement that defines a list of module identifiers to the linker. NEW: Getsys.prg functions Some of the functions in Getsys.prg have been made public so that you can use them when implementing customized Get readers. CHANGED: Getsys.prg Getsys.prg now respects SET BELL ON when SET CONFIRM ON is used. NEW: READFORMAT() READFORMAT() is a function that accesses the current format file in its internal code block representation. NEW: READKILL() READKILL() is a function that lets you control whether or not to terminate the current READ. NEW: READUPDATED() READUPDATED() is intended primarily for creating new READ Layers. CHANGED: GET:subscript Get:subscript is now an assignable exported instance variable. CHANGED: GET:display() The Get:display() exported method now handles delimiters. CHANGED: ERROR.CH The following generic error codes have been added to ERROR.CH: EG_DUPALIAS, EG_BADALIAS, EG_CYCLICAL. NEW: ERRORNEW() The ErrorNew() creates a new error object. NEW: ERRORINHANDLER() ERRORINHANDLER() is a new function that assures a clean and prompt exit from within an application. NEW: TBrowse:forceStable() The new method forceStable() performs a full stabilization of the TBrowse. CHANGED: TBrowse error handling Assigning invalid data to TBrowse and TBColumn instance variables would not generate an error in version 5.01. Type checking during instance variable assignment has been added in CA-Clipper 5.2 to trap invalid values and produce a recoverable runtime error. CHANGED: Compiler The compiler now requires a minimum of 25 file handles. This can be accomplished by adding the files statement "FILES=25" to the CONFIG.SYS. CA-Clipper now required DOS 3.3 or greater. Include files (.ch) may be nested up to a maximum of 15 levels. This limitation was present in previous releases but was not documented. NEW: COMMAND.CH Common.ch has been added to the CA-Clipper 5.2 release. Common.ch incorporates many common/useful psuedo-functions and commands. Std.ch is now reserved for CA-Clipper language implementation ONLY. NEW: Compiler options The following compiler options have been added to CA-Clipper 5.2: /ES Exit Severity level 0 Default exit severity level. /ES0 Exit Severity level 0 Same as /ES. /ES1 Exit Severity level 1 Specifies an exit severity level of 1. /ES2 Exit Severity level 2 Specifies an exit severity level of 2. NEW: /DEBUG option in Linker The /DEBUG option is now supported in the POSITIONAL syntax. CHANGED: BASE50.??? All the base PLL related files have been changed to reflect the new CA-Clipper version 5.2. NEW: Error Messages The following .RTLink error messages are now documented: ert0166, eut0032. CHANGED: DOS 5.0 PLL problem fixed The fix for the DOS 5.0 PLL problem ("Illegal format in loadable file") is included in the version of RTLINK for CA-Clipper. NEW: General Debugger Instance variable and method names are now displayed when inspecting objects instantiated from CA-Clipper's predefined classes (GET, TBROWSE, TBCOLUMN, and ERROR). NEW: Run menu option A "run to next routine" option has been added. NEW: Monitor menu option "All" has been added to the Monitor menu. CHANGED: Watchpoint window The delete key can now be used to delete the currently highlighted watch point. CHANGED: View|Workarea screen The default database driver of the selected workarea is now displayed. Workarea and Index key are hilighted rather than designated by "->". Multiple relations are now displayed in the work area outline. CHANGED: Online Help Online help now appears in a separate file (CLD.HLP). CHANGED: CLD.LIB CLD.LIB must be linked as an OBJ file and not as a LIB file. CHANGED: Command line parameters You must place a space between the CA-Clipper application name and the first CA-Clipper parameter when calling your routine from the CLD.EXE command line. CHANGED: BP command An additional parameter, has been added to the BP command. CHANGED: Open mode in DBU DBU now opens all databases SHARED by default NEW: /e switch The new optional command line parameter (/e) will cause DBU to open file EXCLUSIVE to provide backward compatibility. CHANGED: RL (Report Label) Utility .FRM file changes RL no longer lets you embed semicolons in report headings. This is consistent with dBASE III+. RL no longer allows the right margin setting to exceed the width of the report. NEW: DBMCMD Error messages DBCMD error messages occur in the database command set and are unrelated to a particular driver. They occur as a result of command usage rather than from a failure of the driver itself. CHANGED: NTX The NTX driver now allows you to create conditional indexes by specifying a FOR condition. Create indexes using a record scope or WHILE condition, allowing you to INDEX based on the order of another index. Create both ascending and descending order indexes. Specify an expression that is evaluated periodically during indexing in order to display an index progress indicator. NEW: MDX The MDX replaceable database drivers is used to access dBASE IV compatible index and multiple index (.mdx) file formats. NEW: CDX The CDX driver replaceable database provides access to FoxPro compatible database index file formats (.cdx). NEW: PDX The PDX replaceable database driver provides access to Paradox tables (.pdx). NEW: NOVTERM The NOVTERM driver provides faster execution when run on some non-dedicated network server software. NEW: PCBIOS The PCBIOS driver provides direct BIOS calls rather than direct screen writes for systems requiring this form of I/O. NEW: ANSITERM The ANSITERM driver provides ANSI terminal support for systems that require it. NEW: Drivers Reference CA-Clipper 5.2 provides many new and enhanced (changed) commands and functions that can be used to access and manipulate databases and get specific information about the replaceable database driver (RDD) in use. CHANGED: APPEND FROM command The APPEND FROM command syntax has been changed to include the VIA clause. CHANGED: COPY TO command The COPY TO command syntax has been changed to include the VIA clause. CHANGED: DBAPPEND() function DBAPPEND() has been changed to accept the parameter, lReleaseRecLocks which allows you to maintain multiple records locks during an append. CHANGED: DBGOTO() function DBGOTO() has been modified to accept a parameter other than record number. NEW: DBRLOCK() function DBRLOCK() is a database function that locks the record identified by the specified value . In Xbase, is the record number. NEW: DBRLOCKLIST() function DBRLOCKLIST() is a database function that returns a one-dimensional array that contains the identities of record locks active in the selected work area. NEW: DBRUNLOCK() function DBRUNLOCK() is a database function that releases the lock on and removes it from the Lock List. If is not specified, all record locks are released. CHANGED: DBSETINDEX()* function DBSETINDEX() is a database function that adds the contents of an Order Bag into the Order List of the current work area. DBSETINDEX() is a compatibility command and therefore not recommended. It is superseded by the ORDLISTADD() function. NEW: DELETE TAG command This command removes an Order from an Order Bag in the current or specified work area. CHANGED: GO command The GO command has been enhanced to also work with data format other than (.dbf). In a (.dbf), the parameter, identity, is the record number. In other data formats, identity is the unique primary key value. CHANGED: INDEX command The index on syntax has modified to include new clauses. NEW: ORDBAGEXT() function ORDBAGEXT() supersedes the INDEXEXT() and is not recommended. NEW: ORDBAGNAME() function ORDBAGNAME() is an Order management function that lets you access the name of the Order Bag in which resides. NEW: ORDCREATE() function ORDCREATE() is an Order management function that creates an Order in the current work area. NEW: ORDDESTROY() function ORDDESTROY() is an Order management function that removes a specified Order from multiple-Order Bags. NEW: ORDFOR() function ORDFOR() is an Order management function that returns the character string, cForExp, that represents the logical FOR condition of the Order. NEW: ORDKEY() function ORDKEY() is an Order management function that returns a character expression that represents the key expression of the specified Order. You may specify the Order by name or with a number that represents its position in the Order List. Using the Order name is the preferred method. NEW: ORDLISTADD() function ORDLISTADD() is an Order management function that adds the contents of an Order Bag , or a single Order in an Order Bag, to the Order List. NEW: ORDLISTCLEAR() function ORDLISTCLEAR() is an Order management function that removes all Orders from the Order List for the current or aliased work area. When you are done, the Order List is empty. This function supersedes the function DBCLEARINDEX(). NEW: ORDLISTREBUILD() function ORDLISTREBUILD() is an Order management function that rebuilds all the orders in the current or aliased Order List. NEW: ORDNAME() function ORDNAME() is an Order management function that returns the name of the specified Order in the current Order List. NEW: ORDNUMBER() function ORDNUMBER() is an Order management function that lets you determine the position in the current Order List of the specified Order. NEW: ORDSETFOCUS() function ORDSETFOCUS() is an Order management function that returns the Order Name of the previous controlling Order and optionally sets the focus to an new Order. NEW: RDDLIST() function RDDLIST() is an RDD function that returns a one-dimensional array that lists the available RDDs. NEW: RDDNAME() function RDDNAME() is an RDD function that returns a character string, cRDDName, the name of the active RDD in the current or specified work area. NEW: RDDSETDEFAULT() function RDDSETDEFAULT() is an RDD function that sets or returns the name of the previous default RDD driver and, optionally, sets the current driver to the new RDD driver specified by cNewDefaultRDD. CHANGED: RECNO() function The RECNO() function has been changed to work with other data formats. CHANGED: SEEK command The SEEK command syntax has been changed to include the new clause, SOFTSEEK. CHANGED: SET INDEX command The SET INDEX command syntax has been modified to work with other data formats and includes the new clause, ADDITIVE. CHANGED: SET ORDER command The SET ORDER command has been changed to also work with data formats other than the traditional Xbase(). CHANGED: Extend System API The Extend System is now identified as the Extend API. NEW: GT (General Terminal) API The GT API is the level of system protocols that implements CA-Clipper screen and keyboard commands and functions. NEW: VM API The VM API is a set of functions callable from extend functions that allow direct communication with the VMM system. NEW: RDD API The database driver programming interface (RDD API) can be used by third party developers to create new drivers, allowing CA-Clipper applications compatibility with any database engine for which a driver is created.